home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Apple II Magazines (DO)
/
Micro on the Apple Volume 1 (1981)(Micro Ink)[no boot].zip
/
Micro on the Apple Volume 1 (1981)(Micro Ink)[no boot].do
/
SHAPE2.bas
< prev
next >
Wrap
BASIC Source File
|
1996-12-24
|
6KB
|
151 lines
10 REM ***************************
12 REM * *
14 REM * HOW TO DO A SHAPE TABLE *
16 REM * JOHN FIGUERAS *
18 REM * *
20 REM * SHAPE2 *
21 REM * *
22 REM * COPYRIGHT (C) 1981 *
23 REM * MICRO INK, INC. *
24 REM * CHELMSFORD, MA 01824 *
25 REM * ALL RIGHTS RESERVED *
26 REM * *
27 REM ***************************
28 REM
30 PRINT TAB( 6);"****CREATE A SHAPE TABLE****"
32 PRINT
35 PRINT TAB( 5);"J. FIGUERAS, ROCHESTER, N.Y.": PRINT
40 PRINT TAB( 16)"9/12/79": PRINT
50 PRINT TAB( 17)"****": PRINT
60 REM INPUT TABLE NAME AND LOCATION
70 INPUT "SHAPE TABLE NAME ";NAME$
80 INPUT "STARTING ADDRESS, DECIMAL ";ASVE
90 REM DISK ACCESSES USE DISK D2
100 D$ = CHR$(4): PRINT D$;"NOMON C,I,O"
110 PRINT D$;"BLOAD " +NAME$ +",A" + STR$(ASVE) +",V0,D2"
120 REM GET CAPACITY MAX OF FILE
130 MAX = PEEK(ASVE +2) +256 * PEEK(ASVE +3)
140 MAX = (MAX -2)/2
150 REM GET NO. OF SHAPES IN TABLE
160 N = PEEK(ASVE)
170 REM GET FILE LENGTH
180 INDEX = PEEK(ASVE +2 *N +2) +256 * PEEK(ASVE +2 *N +3)
190 REM COMPUTE ADDRESS OF NEXT FREE BYTE
200 ADDR = ASVE +INDEX
210 REM SEE IF FILE IS FULL
220 IF MAX >N THEN 260
230 PRINT "SHAPE TABLE FULL. NEXT FREE BYTE AT ";ADDR
240 GOTO 1370
250 REM SET UP ADDRESS POINTERS TO TABLE
260 POKE 232,ASVE -256 * INT(ASVE/256): POKE 233, INT(ASVE/256)
270 REM UPDATE SHAPE COUNTER
280 N = N +1: POKE ASVE,N
290 REM DISPLAY PLOTTING GRID. INITIALIZE COUNTER, CYCLE
300 HCOLOR= 3: SCALE= 1: ROT= 0:CYCYLE = 0
310 HGR
320 FOR X = 0 TO 150 STEP 10: HPLOT X,0 TO X,150: NEXT
330 FOR Y = 0 TO 150 STEP 10: HPLOT 0,Y TO 150,Y: NEXT
340 REM CLEAR TEXT AND GET INITIAL PLOT COORDS
350 PRINT : PRINT : PRINT : PRINT
360 PRINT "ENTER STARTING COORDS"
370 INPUT "X ";X:X = 10 *X -5
380 INPUT "Y ";Y:Y = 10 *Y -5
390 DRAW 1 AT X,Y:XS = X:YS = Y
400 REM CLEAR TEXT. DISPLAY INSTRUCTIONS
410 PRINT : PRINT : PRINT : PRINT
420 PRINT "MOVE PLOT CURSOR WITH KEYS"
430 PRINT "L-LEFT R-RIGHT U-UP D-DOWN"
440 PRINT "P TO PLOT Q TO QUIT"
450 REM INITIALIZE KEY$. PLOT CURSOR
460 KEY$ = "":KSVE$ = "": GOTO 570
470 REM FLAG RE-ENABLES CURSOR AFTER A PLOT DISABLE
480 IF FLAG = 1 THEN 520
490 REM ERASE CURSOR IN PREVIOUS SQUARE
500 XDRAW 1 AT X1,Y1
510 REM PLOT CURSOR AT NEW X,Y. SAVE X,Y
520 X1 = X:Y1 = Y:FLAG = 0
530 XDRAW 1 AT X,Y
540 REM SAVE LAST TWO KEYSTROKES. KI$ IS NEEDED FOR ERASE R OUTLINE
550 KI$ = KSVE$:KSVE$ = KEY$
560 REM GET NEW KEYSTROKE
570 GET KEY$
580 REM GO TO SIEVE TO GET 3-BIT PLOT VECTOR FROM KEY$ AND KSVE$
590 IF KEY$ < >"U" THEN 610
600 SYMBOL = 0:Y = Y -10: GOTO 760
610 IF KEY$ < >"R" THEN 630
620 SYMBOL = 1:X = X +10: GOTO 760
630 IF KEY$ < >"D" THEN 650
640 SYMBOL = 2:Y = Y +10: GOTO 760
650 IF KEY$ < >"L" THEN 670
660 SYMBOL = 3:X = X -10: GOTO 760
670 IF KEY$ < >"P" THEN 690
680 FLAG = 1: GOSUB 1000: GOTO 530
690 IF KEY$ = "Q" THEN 1080
700 REM NEXT STATEMENT PROTECTS FROM KEYING ERROR
710 IF KEY$ < >"E" THEN 570
720 HCOLOR= 0:FLAG = 0: GOSUB 1000
730 REM SET UP PRE-PLOT STATUS
740 KSVE$ = KI$: HCOLOR= 3: GOTO 500
750 REM ADJUST 3-BIT VECTOR FOR PLOT
760 IF KSVE$ = "P" THEN SYMBOL = SYMBOL +4
770 REM LOAD 3-BIT VECTOR INTO BYTE
780 CYCLE = CYCLE +1
790 IF CYCLE < >1 THEN 810
800 BYTE = SYMBOL: GOTO 480
810 IF CYCLE < >2 THEN 900
820 BYTE = BYTE +8 *SYMBOL
830 REM PROTECT AGAINST PREMATURE END-OF-RECORD
840 IF BYTE >7 THEN 480
850 REM ENTER DUMMY RIGHT MOVE AND STORE BYTE
860 BYTE = BYTE +8: POKE ADDR,BYTE:ADDR = ADDR +1
870 REM ENTER UP MOVE AND DUMMY LEFT MOVE IN NEW BYTE
880 BYTE = 24:CYCLE = 2: GOTO 480
890 REM ID THIRD 3-BIT VECTOR IS A MOVE ONLY, FINISH BYTE; ELSE LOAD BYTE INTO TABLE AND STORE 3-BIT VECTOR IN NEXT BYTE.
900 IF SYMBOL >3 THEN 930
910 BYTE = BYTE +64 *SYMBOL
920 REM STORE BYTE
930 POKE ADDR,BYTE:ADDR = ADDR +1
940 REM STORE 3-BIT VECTOR IN NEXT BYTE IF NEEDED
950 IF SYMBOL = 0 OR SYMBOL >3 THEN 980
960 REM PREPARE FOR NEXT BYTE. GET NEXT 3-BIT VECTOR
970 CYCLE = 0: GOTO 480
980 CYCLE = 1:BYTE = SYMBOL: GOTO 480
990 REM PLOT ROUTINE
1000 FOR Y2 = Y -3 TO Y +3 STEP 6: HPLOT X -1,Y2 TO X +1,Y2: NEXT
1010 FOR Y2 = Y -2 TO Y +2 STEP 4: HPLOT X -2,Y2 TO X +2,Y2: NEXT
1020 FOR Y2 = Y -1 TO Y +1: HPLOT X -3,Y2 TO X +3,Y2: NEXT
1030 REM TURN OFF CURSOR IN PLOTTED SQ.
1040 IF X = XS AND Y = YS THEN RETURN
1050 XDRAW 1 AT X,Y: RETURN
1060 REM PREPARE BYTE FOR QUIT
1070 REM CLOSE OUT BYTE FOR MOVE-ONLY
1080 IF KSVE$ < >"P" THEN 1150
1090 REM USE PLOT-THEN-UP VECTOR TO END
1100 IF CYCLE < >2 THEN 1120
1110 POKE ADDR,BYTE:ADDR = ADDR +1
1120 IF CYCLE < >1 THEN 1140
1130 BYTE = BYTE +32: GOTO 1150
1140 BYTE = 4
1150 POKE ADDR,BYTE:ADDR = ADDR +1
1160 REM ADD RECORD MARK. DISPLAY NEW SHAPE
1170 POKE ADDR,0:ADDR = ADDR +1: XDRAW N AT 200,75
1180 INPUT "SAVE SHAPE? Y/N ";KI$
1190 IF KI$ = "Y" THEN 1220
1200 N = N -1: GOTO 180
1210 REM GET INDEX FOR NEXT FREE BYTE
1220 N = N +1:ADDR = ADDR -ASVE
1230 IF N <MAX THEN 1270
1240 PRINT "WARNING: TABLE FULL WITH THIS SHAPE"
1250 IF N >MAX THEN 1310
1260 REM STORE INDEX IN DIRECTORY
1270 POKE ASVE +2 *N,ADDR -256 * INT(ADDR/256)
1280 POKE ASVE +2 *N +1, INT(ADDR/256)
1290 INPUT "DONE? Y/N ";KI$
1300 IF KI$ = "N" THEN 160
1310 INPUT "SAVE TABLE? Y/N ";KI$
1320 REM RESPONSE PROTECTED AGAINST RANDOM KEY HIT
1330 IF KI$ = "Y" THEN 1360
1340 IF KI$ = "N" THEN 1370
1350 GOTO 1310
1360 PRINT D$;"BSAVE" +NAME$ +",A" + STR$(ASVE) +",L" + STR$(ADDR)
1370 END